// 服务器与网络配置模块
const cors = require('cors'); //跨域模块
const http = require('http'); // 导入系统自带http请求
const express = require('express'); // 引入express模块，用于创建Express应用 
const socketIo = require('socket.io'); // 导入socketio模块
const session = require("express-session"); // 导入express的session模块

// 实际服务器使用的端口号
const port = 3000;
//测试用的端口号
let testPort = port;

// 注册session中间件
// 设置session相关配置
const sessionMiddleware = session({
	secret: "iLremmilG", //生成session签名的依据，这个生成的名称叫什么无所谓，但是不能太好猜
	resave: true, //是否强制更新session数据，哪怕session没有修改
	saveUninitialized: true, //设置初始值的方法，强制让初始化的session存储,默认值true
	cookie: {
		maxAge: 1000 * 60 * 60 * 24, //session最大保存时间
		// secure不能设置为true!!!,设置了之后socket的session无法更新!!!
		// 这是一个坑，同学们可以作为难点写到简历中
		secure: false,
	}
});

// 跨域配置
const corsOptions = {
	//配置跨域服务器
	origin: ["http://localhost:8080"],
	// 设置每次发送携带凭证（cookie）
	credentials: true
};

// 创建Express应用  
const app = express();
// 将express的app和socket.io服务器绑定
const server = http.createServer(app);
// 创建socketio链接对象
// 这个是专门用来创建长链接的，有了长链接才能实现实时通讯
const io = socketIo(server, {
	connectionStateRecovery: {},
	// 这里需要设置web服务器的跨域cors
	cors: corsOptions
});


// http配置允许跨域
// 原本浏览器会禁止服务器跨域行为
// 特别是我们有逻辑服务器，和前端服务器，不是一个端口，所以一定会有跨域问题
// 这里设置了所有的跨域行为都允许执行，这样写上线会不安全
// 之后会修改成部分的请求允许通过
app.use(cors(corsOptions));

// 使用session对象配置session相关属性
app.use(sessionMiddleware);
// 在socketio中，设置了session中间件
io.engine.use(sessionMiddleware);

module.exports = {
	port, //端口号配置
	testPort, //测试的端口号
	app, //express服务器
	server, //http服务器
	io, //socket服务器
}